/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.consultorio.dao;

import br.com.consultorio.bean.Convenio;
import br.com.consultorio.bean.Endereco;
import br.com.consultorio.bean.Funcao;
import br.com.consultorio.bean.Funcionario;
import br.com.consultorio.bean.Paciente;
import br.com.consultorio.bean.Usuario;
import br.com.consultorio.util.FabricaConexao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author L3nfers
 */
public class PacienteDaoImp implements PacienteDao {

    Connection conn;
    PreparedStatement ps;
    ResultSet rs;
    Paciente paciente;
    PessoaDao pessoaDao;

    @Override
    public List pesquisaPorNome(String nome) throws Exception {
        List pacientes = new ArrayList();
        try {
            String consulta = "SELECT * FROM paciente c JOIN pessoa p ON p.id = c.idPessoa JOIN"
                    + " endereco e ON p.endereco_id = e.id WHERE p.nome LIKE ?";
            conn = FabricaConexao.abreConexao();
            ps = conn.prepareStatement(consulta);
            ps.setString(1, "%" + nome + "%");
            rs = ps.executeQuery();

            while (rs.next()) {

                paciente = new Paciente();

                paciente.setId(rs.getInt("c.idPessoa"));
                paciente.setNome(rs.getString("p.nome"));
                paciente.setCpf(rs.getString("p.cpf"));
            //    paciente.setDataNasc(rs.getDate("p.nascimento"));
                paciente.setTelefone(rs.getString("p.telefone"));
                paciente.setEmail(rs.getString("p.email"));
//                paciente.getConvenio().setCobertura("p.convenio.cobertura");
//                paciente.getConvenio().setNome("p.convenio.nome");

                Endereco end = new Endereco();
                end.setRua(rs.getString("e.rua"));
                end.setBairro(rs.getString("e.bairro"));
                end.setCidade(rs.getString("e.cidade"));
                end.setEstado(rs.getString("e.estado"));
                end.setCep(rs.getString("e.cep"));
                paciente.setEndereco(end);             

                pacientes.add(paciente);
            }
        } catch (Exception e) {
            throw new Exception("Paciente - erro ao tentar PESQUISAR POR NOME " + e.getMessage());
        } finally {
            FabricaConexao.fechaConexao(conn, ps, rs);
        }
        return pacientes;
    }

    @Override
    public Object salvar(Object obj) throws Exception {

        PessoaDao pessoaDao = new PessoaDaoImp();

        try {
            paciente = (Paciente) pessoaDao.salvar(obj);

            String SQL = "INSERT INTO paciente (idPessoa) VALUES(?)";
            conn = FabricaConexao.abreConexao();
            ps = conn.prepareStatement(SQL);

            ps.setInt(1, paciente.getId());
            ps.executeUpdate();

        } catch (Exception e) {
            throw new Exception("\nPaciente - Erro ao SALVAR "
                    + e.getMessage());
        } finally {
            FabricaConexao.fechaConexao(conn, ps);
        }

        return paciente;
    }

    @Override
    public void alterar(Object obj) throws Exception {
        paciente = (Paciente) obj;
        pessoaDao = new PessoaDaoImp();

        try {
            pessoaDao.alterar(paciente);
            String SQL = "UPDATE paciente SET idPessoa = ? WHERE idPessoa=?";
            conn = FabricaConexao.abreConexao();
            ps = conn.prepareStatement(SQL);
            ps.setInt(1, paciente.getId());          
            ps.setInt(2, paciente.getId());          
            ps.executeUpdate();

        } catch (Exception e) {
            throw new Exception("Funcionario - Erro ao Tentar ALTERAR Dados."
                    + e.getMessage());
        } finally {
            FabricaConexao.fechaConexao(conn, ps);
        }
    }

    @Override
    public void excluir(int id) throws Exception {
         try {
            String SQL = "DELETE FROM paciente p, convenio_has_paciente has "
                    + "WHERE has.paciente_idPessoa = p.idPessoa, p.idPessoa = ?, has.convenio_id = ? ";
            conn = FabricaConexao.abreConexao();
            ps = conn.prepareStatement(SQL);
            ps.setInt(1, id);
            ps.setInt(2, paciente.getConvenio().getId());
            ps.executeUpdate();
        } catch (Exception e) {
            throw new Exception("Paciente - Erro ao Tentar EXCLUIR Dados."
                    + e.getMessage());
        } finally {
            FabricaConexao.fechaConexao(conn, ps);
        }
    }

    @Override
    public Object procurar(Integer id) throws Exception {
        paciente = new Paciente();
        try {
            String consulta = "SELECT * FROM paciente c "
                    + "JOIN pessoa p ON p.id = c.idPessoa "
                    + "JOIN endereco e ON p.endereco_id = e.id "
                    + "JOIN convenio_has_paciente has ON has.paciente_idPessoa = c.idPessoa "
                    + "JOIN convenio ven ON ven.id = has.convenio_id "
                    + "JOIN usuario u ON u.idPessoa = p.id WHERE p.id = ?";
            conn = FabricaConexao.abreConexao();
            ps = conn.prepareStatement(consulta);
            ps.setInt(1, id);
            rs = ps.executeQuery();

            if (!rs.next()) {
                return paciente;
            }
            paciente.setId(id);
            paciente.setNome(rs.getString("p.nome"));
            paciente.setCpf(rs.getString("p.cpf"));
            paciente.setDataNasc(rs.getDate("p.dataNasc"));
            paciente.setTelefone(rs.getString("p.telefone"));
            paciente.setEmail(rs.getString("p.email"));
            
            Usuario usuario = new Usuario();
            usuario.setLogin(rs.getString("u.login"));
            usuario.setSenha(rs.getString("u.senha"));
            paciente.setUsuario(usuario);
            
            Convenio convenio = new Convenio();
            convenio.setId(rs.getInt("ven.id"));
            convenio.setNome(rs.getString("ven.nome"));
            convenio.setCobertura(rs.getString("ven.cobertura"));
            paciente.setConvenio(convenio);

            Endereco end = new Endereco();
            end.setId(rs.getInt("e.id"));
            end.setRua(rs.getString("e.rua"));
            end.setBairro(rs.getString("e.bairro"));
            end.setCidade(rs.getString("e.cidade"));
            end.setEstado(rs.getString("e.estado"));
            end.setCep(rs.getString("e.cep"));
            paciente.setEndereco(end);
            
        } catch (Exception e) {
            throw new Exception("Paciente - erro ao tentar PESQUISAR " + e.getMessage());
        } finally {
            FabricaConexao.fechaConexao(conn, ps, rs);
        }
        return paciente;
    }

    @Override
    public List<Object> listar() throws Exception {
        List pacientes = new ArrayList();
        try {
            String consulta = "SELECT * "
                    + "FROM paciente c JOIN pessoa p ON p.id = c.idPessoa JOIN endereco e ON p.id = e.id";
            conn = FabricaConexao.abreConexao();
            ps = conn.prepareStatement(consulta);
            rs = ps.executeQuery();


            EnderecoDaoImp enderecoDao = new EnderecoDaoImp();
            while (rs.next()) {
                paciente = new Paciente();

                paciente.setId(rs.getInt("id"));
                paciente.setNome(rs.getString("p.nome"));
                paciente.setCpf(rs.getString("p.cpf"));
                paciente.setDataNasc(rs.getDate("p.nascimento"));
                paciente.setTelefone(rs.getString("p.telefone"));
                paciente.setEmail(rs.getString("p.email"));

                Endereco endereco = new Endereco();
                endereco.setRua(rs.getString("e.rua"));
                endereco.setBairro(rs.getString("e.bairro"));
                endereco.setCidade(rs.getString("e.cidade"));
                endereco.setEstado(rs.getString("e.estado"));
                endereco.setCep(rs.getString("e.cep"));

                paciente.setEndereco(endereco);

                pacientes.add(paciente);
            }
        } catch (Exception e) {
            throw new Exception("Paciente - Erro ao tentar LISTAR "
                    + e.getMessage());
        } finally {
            FabricaConexao.fechaConexao(conn, ps, rs);
        }
        return pacientes;
    }
}
